package cn.fz.singleton;

/**
 * 3. 双重检查锁定（Double-Checked Locking）
 * 为了兼顾懒加载和线程安全，可以使用双重检查锁定。
 * 优点：
 * 在高并发环境下可以保证线程安全，同时避免了不必要的同步开销。
 * 缺点：
 * 实现相对复杂，并且在某些旧版本的JDK中，可能会因为指令重排序带来问题。不过在JDK1.5及以上版本中通过 volatile 关键字可以避免该问题。
 */
public class DoubleCheckedLockingSingleton implements ISingletonMethod{
    // 使用 volatile 关键字，确保多线程环境下的可见性
    private static volatile DoubleCheckedLockingSingleton instance;

    private DoubleCheckedLockingSingleton() {
        // 构造函数私有化，避免外部直接创建实例
    }

    public static DoubleCheckedLockingSingleton getInstance() {
        if (instance == null) {
            synchronized (DoubleCheckedLockingSingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckedLockingSingleton();
                }
            }
        }
        return instance;
    }

    @Override
    public void show() {
        System.out.println("双重检查锁定: DoubleCheckedLockingSingleton");
    }
}
